home *** CD-ROM | disk | FTP | other *** search
- /*
- stage000.c
-
- 親:COM
- 子:PLAYER
-
- */
- #include <math.h>
- #include <iocslib.h>
- #include <stdlib.h>
- #include "STRUCTS.INC"
- #include "MAINSYS.INC"
- #include "SPCTBL.INC"
- #include "stepman.inc"
-
-
- int STAGE000_JOB();
- int CHRTEST000_JOB();
- int PLAYER000_JOB();
- int ENEMY000_JOB();
-
-
- extern int shtmod;
- extern int dipSwitch;
- /*
- ディップスイッチ
- 0@@@ @@@@
- ||| |||+--予約
- ||| ||+---負け直前
- ||| |+----勝ち直前
- ||| +-----デバッグ情報のprint
- ||+-------思考時のにおける変動確率を固定
- |+--------強制アニメOFF
- +---------感情判断(0=kanjyo_KIAI/1=kanjyo_HNADAN)
- */
-
-
-
- extern int TNUM__SetPalet();
-
- extern int TR_PUT();
-
- /*
- ステージ用タスク初期設定
- */
- int StepMan__stage000_init()
- {
- TASK *mTask;
-
- srand(ONTIME());
- AllTaskFree();
-
- mTask=MTaskAlloc();
- if( shtmod==0 ){
- mTask->func_addr=STAGE000_JOB;
- }
- else{
- mTask->func_addr=CHRTEST000_JOB;
- }
-
- return(0);
- }
-
-
-
- short kanjyo_NOW; //現在の感情値
- short kanjyo_HYOUKA; //現在の感情評価値
- char *kanjyo_HYOUKA_STR[5]={
- "大喜","喜","普通","哀","大哀"
- };
-
-
- short kanjyo_HANDAN_lv=3; //どの感情評価判断値を使うか
- short kanjyo_HANDAN[7][6]={ //感情評価判断値
-
- // | 20| 40 | 136 | 40 |20 |(動じない)
- { 127, 107, 67, -69,-109,-128 },
- // | 24 | 48 | 112 | 48 | 24 |
- { 127, 103, 55, -57,-105,-128 },
- // | 32 | 56 | 80 | 56 | 32 |
- { 127, 95, 39, -41, -97,-128 },
-
- // | 32 | 72 | 48 | 72 | 32 |(普通?)
- { 127, 95, 23, -25, -97,-128 },
-
- // | 40 | 64 | 48 | 64 | 40 |
- { 127, 87, 23, -25, -89,-128 },
- // | 48 | 64 | 32 | 64 | 48 |
- { 127, 79, 15, -15, -81,-128 },
- // | 56 | 56 | 24 | 56 | 56 |(動じる)
- { 127, 71, 11, -13, -73,-128 }
- };
-
- char *kanjyo_HANDAN_STR[7]={
- "全く動じない","多少のコトでは動じない","あまり動じない",
- "普通",
- "少し動じる","かなり動じる","絶望的に動じる"
- };
-
-
-
-
- short kanjyo_KIAI_lv=3; //喜哀判断値どの感情評価判断値を使うか
- short kanjyo_KIAI[7][6]={ //感情評価判断値
-
- // 12 40 64 76 64 (喜び難い大)
- { 127, 115, 75, 11, -65,-128 },
- // 24 44 76 68 44 (喜び難い中)
- { 127, 103, 59, -17, -85,-128 },
- // 28 48 76 64 40 (喜び難い小)
- { 127, 99, 51, -25, -89,-128 },
- //○ | 32 | 64 | 64 | 64 | 32 |(普通?)
- { 127, 95, 31, -33, -97,-128 },
- // | 40 | 64 | 76 | 48 | 28 |(喜び易い小)
- { 127, 87, 23, -53,-101,-128 },
- // | 44 | 68 | 76 | 44 | 24 |(喜び易い中)
- { 127, 83, 15, -61,-105,-128 },
- // | 64 | 76 | 64 | 40 |12|(喜び易い大)
- { 127, 63, -13, -77,-117,-128 }
-
- };
-
- char *kanjyo_KIAI_STR[7]={
- "絶望的に喜び難い","かなり喜び難い","少し喜び難い",
- "普通",
- "少し喜び易い","かなり喜び易い","メッチャ喜び易い",
- };
-
-
-
- short biorhythm_theta;
- short biorhythm_tbl[7+1]={
- // | 16| 36 | 48 | 56 | 48 | 36 |16 |
- 127,111,75,27,-29,-77,-113,-128
- };
-
- short card_MOUNTAIN[52]; //カードの山:それぞれ1~52が入る
- short card_PTR; //山から使ったカードの数:先頭ポインタのようなもの
- short card_PLAYER[5]; //プレーヤーの手札
- short card_COM[5]; //COMの手札
- short card_PLAYER_HAVE; //プレーヤーが持っている枚数
- short card_COM_HAVE; //COMが持っている枚数
-
- // +--------配られた枚数(2~5)0,1はダミー
- // + ++----現在のカード番号の合計(~21まで)
- short card_PLUS_KANJYO[6][22]={
- //0
- {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
- //1
- {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
-
- //・最初に2枚配った時の値による感情値(デフォルト?)
- { 0,0,-1,-1,-2,-2,-1,0,1,2,3,3,0,-1,-2,-3,-3,-1,0,2,6,7 },
-
- //・3枚目
- { 0,0,0,-4,-3,-3,-2,-1,-1,-1,1,1,0,-1,-1,-2,-2,-1,0,1,5,6 },
-
- //・4枚目
- { 0,0,0,0,-4,-3,-2,-2,-2,-2,1,1,0,0,-1,-1,-1,0,0,1,4,5 },
-
- //・5枚目
- { 0,0,0,0,0,0,-5,-5,-5,-5,-5,-4,-4,-4,-2,-2,-1,0,0,1,2,3 }
- };
-
- short card_LOST_KANJYO[21]={
- //・3枚目以降の失敗
- 0,0,0,0,0,0,0,0,0,0,0,0,-7,-7,-6,-6,-5,-4,-5,-5,-6
- };
-
- /*
- /勝利 /敗北
- 敵2345 敵2345
- 2+5+6+5+4 2-6-4-5-4
- 自 3+6+5+4+4 自 3-5-6-5-4
- 分 4+4+5+6+5 分 4-4-5-6-5
- 5+4+4+5+6 5-4-4-5-6
- */
- // +----PLAYER枚数
- // | +-COM枚数
- short bounus_WIN[6][6]={
- {0,0,0,0,0,0},
- {0,0,0,0,0,0},
-
- {0,0,5,6,5,4},
- {0,0,6,5,4,4},
- {0,0,4,5,6,5},
- {0,0,4,4,5,6}
- };
-
- short bounus_LOSE[6][6]={
- {0,0,0,0,0,0},
- {0,0,0,0,0,0},
-
- {0,0,-6,-4,-5,-4},
- {0,0,-5,-6,-5,-4},
- {0,0,-4,-5,-6,-5},
- {0,0,-4,-4,-5,-6}
- };
-
-
-
- /*
- ゲーム固有系?
- */
- // チップ
- short chips_PLAYER,chips_oPLAYER, //PLAYERの
- chips_COM, //COMのチップの数
- chips_BET; //場にかけてあるチップの数
-
- /* COMの連勝カウンタ
- */
- short winlose_COM_COMBO, //連勝(負)カウンタ+nで連勝数、-nで連敗数
- winlose_COM_DRAW_COMBO; //連勝引き分けカウンタ
-
- #define winlose_COM_HISTORYS (5) //過去の勝負履歴
- short winlose_COM_HISTORY[4]; //過去4回分の勝負履歴
-
- short winlose_COM_WIN_TOTAL, //合計勝ち数
- winlose_COM_LOSE_TOTAL, // 負け
- winlose_COM_DRAW_TOTAL, // 引き分け
- winlose_COM_GAME_TOTAL; // 試合数
-
-
-
-
- /*
- バイオリズム値(0~6)を得る
- */
- short get_biorhythm()
- {
- short b,bn;
- b=(short) (sin(biorhythm_theta*3.14/180)*127);
-
- for( bn=0; bn<7; bn++ ){
- if( biorhythm_tbl[bn]>=b && b>=biorhythm_tbl[bn+1] ){
- break;
- }
- }
- return(bn);
- }
-
-
-
- //カードの数字を得る
- short card_NUM(card)
- short card;
- {
- short num;
- if( card>39 ){ num=card-39; }
- else if( card>26 ){ num=card-26; }
- else if( card>13 ){ num=card-13; }
- else { num=card; }
-
- return(num);
- }
-
-
-
- /*
- 手札の初期化および
- カードのシャッフル
- */
- short card_SHUF()
- {
- char al[52+1]; //配置済みか?0=まだ/1=済み
- short cn,r,alcn;
-
- card_PTR=0;
- for( cn=0; cn<5; cn++ ){
- card_PLAYER[cn]=0; //手札の初期化
- card_COM[cn]=0;
- }
- for( cn=0; cn<53; cn++ ){ al[cn]=0; }
- alcn=0;
- cn=0;
- while( cn<52 ){
- r=rand()%52+1;
- if( al[r]==0 ){
- card_MOUNTAIN[alcn++]=r;
- al[r]=1;
- cn++;
- }
- }
- return(0);
- }
-
-
- //カードを1枚配る
- short card_KUBARU()
- {
- short res;
-
- res=card_MOUNTAIN[card_PTR];
- card_MOUNTAIN[card_PTR]=0; //配りましたマーク
- card_PTR++;
-
- return(res);
- }
-
- //プレーヤーのカードの合計値
- short card_TOTAL(ptr)
- short *ptr;
- {
- short cn,total,num,ev=0;
-
- total=0;
- for( cn=0; cn<5; cn++ ){
- num=card_NUM(*(ptr+cn));
- if( num==1 ){
- ev=10;
- }
- total+=min(num,10);
- }
- if( total+10<=21 ){
- total+=ev;
- }
-
- return(total);
- }
-
-
-
- /*
- 777カードチェック
- 777の場合=1/それ以外=0
- */
- short card_CHECK777(ptr)
- short *ptr;
- {
- short res=0;
-
- if(
- card_NUM(*(ptr+0))==7 &&
- card_NUM(*(ptr+1))==7 &&
- card_NUM(*(ptr+2))==7 &&
- card_NUM(*(ptr+3))==0
- ){
- res=1;
- }
-
- return(res);
- }
-
-
-
- /*
- 678カードチェック
- 678の場合=1/それ以外=0
- */
- short card_CHECK678(ptr)
- short *ptr;
- {
- short res=0,cn;
- short num[16];
-
- if( card_NUM(*(ptr+2)) && card_NUM(*(ptr+3))==0 ){
- //カードは3枚
- for( cn=0; cn<16; cn++ ){
- num[cn]=0;
- }
- for( cn=0; cn<=2; cn++ ){
- num[card_NUM(*(ptr+cn))]++;
- }
- if( num[6]==1 && num[7]==1 && num[8]==1 ){
- res=1;
- }
- }
-
- return(res);
- }
-
-
-
- /*
- 5枚のカードで21チェック
- 該当の場合=1/それ以外=0
- */
- short card_CHECK5CARD21(ptr)
- short *ptr;
- {
- short res=0;
-
- if( card_NUM(*(ptr+4)) ){
- //カードは5枚
- if( card_TOTAL(ptr)==21 ){
- res=1;
- }
- }
-
- return(res);
- }
-
-
-
- /*
- どぼんする前のカードの合計値
- */
-
- short card_last_TOTAL(ptr)
- short *ptr;
- {
- short cn,cs,total,num,ev=0;
-
- for( cn=0,cs=0; cn<5; cn++,cs++ ){
- if( card_NUM(*(ptr+cn))==0 ){
- cs--;
- break;
- }
- }
-
- total=0;
- for( cn=0; cn<cs; cn++ ){
- num=card_NUM(*(ptr+cn));
- if( num==1 ){
- ev=10;
- }
- total+=min(num,10);
- }
- if( total+10<=21 ){
- total+=ev;
- }
-
-
- return(total);
- }
-
-
-
- /*
- COMの思考
- RES:もう1枚もらう=1以上/もらわない=0
- @@超暫定、といいつつ、多分このまま
- 今、メッチャ適当
- というか、確率だけで、考えていない
- */
- short Com_think()
- {
- short lv[9][4]={
- // 17,18,19,20
- { 94,49,24, 9}, //4割増
- { 87,45,22, 8}, //3割増
- { 80,41,20, 7}, //2割増
- { 73,37,18, 6}, //1割増
-
- { 66,33,16, 5}, //基本?
-
- { 59,29,14, 4}, //1割減
- { 52,25,12, 3}, //2割減
- { 45,21,10, 2}, //3割減
- { 38,17, 8, 1} //4割減
- };
- short cmp_tbl[4];
-
- int res=0;
- short total,r100,klv;
-
- total=card_TOTAL(card_COM);
- r100=rand()%100;
- klv=kanjyo_HYOUKA+(rand()%3-1); //感情評価を基準
- switch( rand()%5 ){ //幅の持たせ方
- case 0: ///強い
- cmp_tbl[0]=lv[klv+1][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv-1][2];
- cmp_tbl[3]=lv[klv-2][3];
- break;
- case 1: ///弱い
- cmp_tbl[0]=lv[klv][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv-1][2];
- cmp_tbl[3]=lv[klv-1][3];
- break;
- case 2: //-
- cmp_tbl[0]=lv[klv][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv][2];
- cmp_tbl[3]=lv[klv][3];
- break;
- case 3: //\弱い
- cmp_tbl[0]=lv[klv][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv+1][2];
- cmp_tbl[3]=lv[klv+1][3];
- break;
- case 4: //\強い
- cmp_tbl[0]=lv[klv-1][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv+1][2];
- cmp_tbl[3]=lv[klv+2][3];
- break;
- }
-
- if( dipSwitch&0x08 ){
- printf("%d,%d,%d,%d->%d\n",
- cmp_tbl[0],cmp_tbl[1],cmp_tbl[2],cmp_tbl[3],r100);
- }
-
- if( dipSwitch&0x10 ){ //開発中の固定率を使用
- klv=3;
- cmp_tbl[0]=lv[klv][0];
- cmp_tbl[1]=lv[klv][1];
- cmp_tbl[2]=lv[klv][2];
- cmp_tbl[3]=lv[klv][3];
- }
-
- if( 0<=total && total<=16 ){ //親は、16以下では勝負出来ないらしい
- res++;
- }
- else if( 17<=total && total<=17 ){
- if( r100<cmp_tbl[0] ){
- res++;
- }
- }
- else if( 18<=total && total<=18 ){
- if( r100<cmp_tbl[1] ){
- res++;
- }
- }
- else if( 19<=total && total<=19 ){
- if( r100<cmp_tbl[2] ){
- res++;
- }
- }
- else if( 20<=total && total<=20 ){
- if( r100<cmp_tbl[3] ){
- res++;
- }
- }
-
- return(res);
- }
-
-
-
-
- /*
- 現在使用している感情評価判断ブロックから、感情評価値を求める
- */
- short get_kanjyo_hyouka()
- {
- short kn,khlv;
- // khlv=kanjyo_HANDAN_lv;
- khlv=get_biorhythm();
- for( kn=0; kn<=4; kn++ ){
- //
- if( dipSwitch & 0x40 ){
- if( kanjyo_HANDAN[khlv][kn]>=kanjyo_NOW && kanjyo_NOW>=kanjyo_HANDAN[khlv][kn+1] ){
- goto quick_exit;
- }
- }
- else{
- if( kanjyo_KIAI[khlv][kn]>=kanjyo_NOW && kanjyo_NOW>=kanjyo_KIAI[khlv][kn+1] ){
- goto quick_exit;
- // break;
- }
- }
- }
-
- quick_exit:;
- return(kn);
- }
-
-
-
- /*
- 感情値リミッター(+127~-128)
- */
- short kanjyo_limit(k)
- short k;
- {
- short res;
-
- res=k;
- if( res>=127 ){ res=127; }
- else if( res<=-128 ){ res=-128; }
-
- return(res);
- }
-
-
-
- void card_KUBARU_PLAYER()
- {
- card_PLAYER[card_PLAYER_HAVE++]=card_KUBARU();
- }
-
- void card_KUBARU_COM()
- {
- card_COM[card_COM_HAVE++]=card_KUBARU();
- }
-
- void biorhythm_FIRSTSTEP()
- {
- biorhythm_theta=270;
- }
-
- void biorhythm_NEXTSTEP()
- {
- biorhythm_theta+=((rand()%4)+1+rand()%(8-kanjyo_HYOUKA));
- }
-
- void kanjyo_plus_KOUSIN()
- {
- kanjyo_NOW+=card_PLUS_KANJYO[card_COM_HAVE][card_TOTAL(card_COM)];
- kanjyo_NOW=kanjyo_limit(kanjyo_NOW);
- }
-
- void kanjyo_dobon_KOUSIN()
- {
- kanjyo_NOW+=card_LOST_KANJYO[card_last_TOTAL(card_COM)];
- kanjyo_NOW=kanjyo_limit(kanjyo_NOW);
- }
-
- void kanjyo_hyouka_KOUSIN()
- {
- kanjyo_HYOUKA=get_kanjyo_hyouka(); //感情評価判定
- }
-
-
- void winlose_INIT()
- {
- short cn;
-
- winlose_COM_HISTORY[0]=-1;
- for( cn=1; cn<winlose_COM_HISTORYS; cn++ ){
- winlose_COM_HISTORY[cn]=0;
- }
- winlose_COM_COMBO=0;
- winlose_COM_WIN_TOTAL=0;
- winlose_COM_LOSE_TOTAL=0;
- winlose_COM_DRAW_TOTAL=0;
- winlose_COM_GAME_TOTAL=0;
- }
-
-
- void winlose_HISTORY_KOUSIN()
- {
- short hn;
-
- for( hn=winlose_COM_HISTORYS-1; hn>=1; hn-- ){
- winlose_COM_HISTORY[hn]=winlose_COM_HISTORY[hn-1];
- }
- }
-
- void winlose_COMBO_COMLOSE()
- {
- if( winlose_COM_COMBO<=0 ){
- winlose_COM_COMBO--; //連敗数更新
- }
- else{
- winlose_COM_COMBO=0; //連勝カウンタリセット
- }
- winlose_COM_LOSE_TOTAL++;
- winlose_COM_HISTORY[0]=-1;
- }
-
- void winlose_COMBO_COMWIN()
- {
- if( winlose_COM_COMBO>=0 ){
- winlose_COM_COMBO++; //連勝数更新
- }
- else{
- winlose_COM_COMBO=0; //連負カウンタリセット
- }
- winlose_COM_WIN_TOTAL++;
- winlose_COM_HISTORY[0]=1;
- }
-
- void chips_INIT()
- {
- if( dipSwitch&0x02 ){
- chips_COM=98;
- chips_PLAYER=2;
- chips_oPLAYER=2;
- }
- else if( dipSwitch&0x04 ){
- chips_COM=2;
- chips_PLAYER=98;
- chips_oPLAYER=98;
- }
- else{
- /*
- ここが標準設定
- */
- chips_COM=66; //初期チップ数設定
- chips_PLAYER=34;
- chips_oPLAYER=34;
- }
- }
-
- void chips_PLAYER_FIRSTBET()
- {
- chips_BET=1;
- chips_PLAYER-=1;
- }
-
- void chips_PLAYER_SECONDBET()
- {
- chips_BET+=1;
- chips_PLAYER-=1;
- }
-
-
- void change_BGM()
- {
- //↑
- if( chips_oPLAYER<75 && 75<=chips_PLAYER ){
- SOUND_CALL(BGM_GOOD);
- }
- if( chips_oPLAYER<25 && 25<=chips_PLAYER ){
- SOUND_CALL(BGM_MAIN);
- }
-
- //↓
- if( chips_oPLAYER>75 && 75>=chips_PLAYER ){
- SOUND_CALL(BGM_MAIN);
- }
- if( chips_oPLAYER>25 && 25>=chips_PLAYER ){
- SOUND_CALL(BGM_NOTGOOD);
- }
- }
-
- void chips_PLAYER_WIN()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_PLAYER+=(chips_BET*2);
- chips_COM-=chips_BET;
- }
-
- void chips_PLAYER_WIN2()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_PLAYER+=(chips_BET*3);
- chips_COM-=(chips_BET*2);
- }
-
- void chips_PLAYER_WIN3()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_PLAYER+=(chips_BET*4);
- chips_COM-=(chips_BET*3);
- }
-
- void chips_COM_WIN()
- {
- chips_oPLAYER=(chips_PLAYER+chips_BET);
- chips_COM+=chips_BET;
- }
-
- void chips_COM_WIN2()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_COM+=(chips_BET*3);
- chips_PLAYER-=(chips_BET*2);
- }
-
- void chips_COM_WIN3()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_COM+=(chips_BET*4);
- chips_PLAYER-=(chips_BET*3);
- }
-
- void chips_MODOSU()
- {
- chips_oPLAYER=chips_PLAYER;
- chips_PLAYER+=chips_BET;
- }
-
-
-
- void clr_field_PLAYER()
- {
- // fill( 32,128,160,255,0x0e00,0xffff); //カード部分全部
- fill(155,128,161,255,0x7800,0xffff);
- }
-
- void clr_field_COM()
- {
- fill(155, 0,161,127,0x7800,0xffff);
- }
-
-
- /*
- カード描画
- */
- void card_DRAW_back_COM()
- {
- short cn,wl=32,
- wi0;
- short wi0t[]={0,0, 64,32,21,16};
- clr_field_COM();
- wi0=wi0t[card_COM_HAVE];
- for( cn=0; cn<5; cn++ ){
- if( card_COM[cn] ) TR_PUT(wl+cn*wi0, 0,0);
- }
- }
-
- void card_DRAW_COM()
- {
- short cn,wl=32,
- wi0;
- short wi0t[]={0,0, 64,32,21,16};
- clr_field_COM();
- wi0=wi0t[card_COM_HAVE];
- for( cn=0; cn<5; cn++ ){
- if( card_COM[cn] ) TR_PUT(wl+cn*wi0, 0,card_COM[cn]);
- }
- }
-
- void card_DRAW_PLAYER()
- {
- short cn,wl=32, //カード左隅の空白
- wi0; //カード表示間隔
- short wi0t[]={0,0, 64,32,21,16};
-
- clr_field_PLAYER();
- wi0=wi0t[card_PLAYER_HAVE];
- for( cn=0; cn<5; cn++ ){
- if( card_PLAYER[cn] ) TR_PUT(wl+cn*wi0,128,card_PLAYER[cn]); //下がPLAYER
- }
- }
-
- void card_DRAW()
- {
- short cn,wl=32, //カード左隅の空白
- wi0; //カード表示間隔
- short wi0t[]={0,0, 64,32,21,16};
- clr_field_COM();
- clr_field_PLAYER();
- for( cn=0; cn<5; cn++ ){
- wi0=wi0t[card_COM_HAVE];
- if( card_COM[cn] ) TR_PUT(wl+cn*wi0, 0,card_COM[cn]); //上がCOM
- wi0=wi0t[card_PLAYER_HAVE];
- if( card_PLAYER[cn] ) TR_PUT(wl+cn*wi0,128,card_PLAYER[cn]); //下がPLAYER
- }
- }
-
- /*
- 小娘さん状態グラフ
- (176,16)-(239,79)=(64,64),中心<239,48>
-
- */
- void graph_KOUSIN()
- {
- static ok,ocp=66*64/100;
- short tmp[64*64],b,y0,y1,cp;
-
- get(177,16,239,79,tmp,63*64*sizeof(short));
- put(176,16,238,79,tmp,63*64*sizeof(short)); //グラフ左ずらし
- box(175,15,240,80,0xffff,0xffff);
-
- line(239,16,239,79,0x7800,0xffff); //けしけし
-
- // pset(239,48-kanjyo_NOW*48/128,0x07c0); //感情値点
- y0=48-ok*31/128;
- y1=48-kanjyo_NOW*31/128;
- line(239,y0,239,y1,0x07c0,0xffff); //感情値線
-
- b=(short) (sin(biorhythm_theta*3.14/180)*31);
- pset(239,48-b,0x003e); //バイオリズム
-
- cp=(chips_COM*64)/(chips_PLAYER+chips_COM);
- line(239,79-ocp,239,79-cp,0x783e,0xffff); //CHIPS
- ocp=cp;
-
- ok=kanjyo_NOW;
- }
-
-
- /*
- チップ数表示
- */
- void print_chips()
- {
- char mes[16];
- sprintf(mes,"CHIPS:%03d",chips_COM);
- PrintSTR(21, 6,mes);
- sprintf(mes,"CHIPS:%03d",chips_PLAYER);
- PrintSTR(21,14,mes);
- sprintf(mes,"BET:%02d",chips_BET);
- PrintSTR(23, 7,mes);
-
- }
-
- void print_gameinfo()
- {
- short cn;
-
- if( dipSwitch&0x08 ){
- locate(0,0); printf("感情値=%d",kanjyo_NOW);
- printf("/バイオリズム/th=%d/%d",get_biorhythm(),biorhythm_theta);
- locate(0,1); printf("感情評価値=%d:%s",kanjyo_HYOUKA,kanjyo_HYOUKA_STR[kanjyo_HYOUKA]);
- printf(":判断=%s",kanjyo_HANDAN_STR[kanjyo_HANDAN_lv]);
- locate(0,2); printf("PLAYER\t%d\t",card_TOTAL(card_PLAYER));
- for( cn=0; cn<5; cn++ ){ printf("%2d ",card_NUM(card_PLAYER[cn])); }
- locate(0,3); printf("COM\t%d\t",card_TOTAL(card_COM));
- for( cn=0; cn<5; cn++ ){ printf("%2d ",card_NUM(card_COM[cn])); }
- locate(0,15); printf("chips COM=%d/PL=%d/BET=%d",chips_COM,chips_PLAYER,chips_BET);
- locate(0,14); printf("Win/Lose/Draw=%d/%d/%d:",winlose_COM_WIN_TOTAL,winlose_COM_LOSE_TOTAL,winlose_COM_DRAW_TOTAL);
- if( winlose_COM_COMBO>=3 ){ printf("COM:%d連勝中",winlose_COM_COMBO); }
- else if( winlose_COM_COMBO<=-3 ){ printf("COM:%d連負中",-winlose_COM_COMBO); }
- locate(0,13); printf("chips:%d/%d",chips_oPLAYER,chips_PLAYER);
- locate(0,4);
- }
-
- graph_KOUSIN();
-
- card_DRAW_back_COM();
- card_DRAW_PLAYER();
-
- print_chips();
-
- }
-
-
- //--------------------------------------------------------------------------------------
- // ゲーム進行
- //--------------------------------------------------------------------------------------
-
-
- typedef enum {
- LS_Init0i, LS_Init0m, //2枚カードを配る
- LS_Player0i, LS_Player0m, //プレーヤーの思考
- LS_Bet0i, LS_Bet0m, //ベット(かけチップの上乗せ)
- LS_Com0i, LS_Com0m, //COMの思考
- LS_Judge0i, LS_Judge0m, //勝負!
- LS_Wait0i, LS_Wait0m, //次の試合待ち
- LS_GameOver0i, LS_GameOver0m, //ゲームオーバー
- LS_GameClear0i, LS_GameClear0m //ゲームクリア
- } LS;
-
-
- /*
- COM顔の種類コード
- */
- typedef enum {
- // faceコード 名称 パターンコード
- faceNULL, // NULL 0
- faceTERE, // 照れ(1) 1
- faceMEPACHI, // 目ぱち(3) 2,3,7
- faceMEPACHI2, // 目ぱち2(3) 4,5,7
- faceUSAKO, // うさこ(1) 6
- faceYUBISASHI, // 指さし(2) 8,9
- faceCLACKER, // クラッカー(3) 10,11,12
- faceOOGUCHI, // 大口(3) 13,14,15
- faceTEFURI, // 手フリ(2) 16,17
- faceBIKKURIMEDAMA, // ビックリ目玉(3) 18,19,20
- faceETTO, // え~っと(3) 21,22,23
- faceHANAMEGANE, // 鼻眼鏡(2) 24,25
- faceKUCHIBUE, // 口笛(2) 26,27
- faceIKARI, // 怒り(2) 28,29
- faceBERO, // ベロ(2) 30,31
- faceTAMEIKI, // ため息(2) 32,33
- faceONEGAI, // お願い(2) 34,35
- faceKATAME, // 片目(2) 36,37
- faceATOZUSARI, // あとずさり(2) 38,39
- faceFUKURETTURA, // 膨れっ面(2) 40,41
- faceEHE, // えへ(2) 42,43
- faceGYO, // ぎょ(2) 44,45
- faceYOKONIKO, // 横ニコ(2) 46,47
- faceMEHABANAMIDA, // 目幅涙(4) 48,49,50,51
- facePERORI, // ペロリ(4) 52,53,54,55
- faceBIMYO // 微妙(4) 56,57,58,59
- } FACE;
-
-
- /*
- COM顔コードに対応する、スプライトドライバ用パターン(disp0_anim)番号
- */
- //charはまずい:奇数アドレスにアライメントされる
- short facePAT[faceBIMYO+1][4]={
- {0,0,0,0 }, //faceNULL, NULL
- {1,0,0,0 }, //faceTERE, 照れ(1)
- {2,3,7,0 }, //faceMEPACHI, 目ぱち(3)
- {4,5,7,0 }, //faceMEPACHI2, 目ぱち2(3)
- {6,0,0,0 }, //faceUSAKO, うさこ(1)
- {8,9,0,0 }, //faceYUBISASHI, 指さし(2)
- {10,11,12,0 }, //faceCLACKER, クラッカー(3)
- {13,14,15,0 }, //faceOOGUCHI, 大口(3)
- {16,17,0,0 }, //faceTEFURI, 手フリ(2)
- {18,19,20,0 }, //faceBIKKURIMEDAMA, ビックリ目玉(3)
- {21,22,23,0 }, //faceETTO, え~っと(3)
- {24,25,0,0 }, //faceHANAMEGANE, 鼻眼鏡(2)
- {26,27,0,0 }, //faceKUCHIBUE, 口笛(2)
- {28,29,0,0 }, //faceIKARI, 怒り(2)
- {30,31,0,0 }, //faceBERO, ベロ(2)
- {32,33,0,0 }, //faceTAMEIKI, ため息(2)
- {34,35,0,0 }, //faceONEGAI, お願い(2)
- {36,37,0,0 }, //faceKATAME, 片目(2)
- {38,39,0,0 }, //faceATOZUSARI, あとずさり(2)
- {40,41,0,0 }, //faceFUKURETTURA, 膨れっ面(2)
- {42,43,0,0 }, //faceEHE, えへ(2)
- {44,45,0,0 }, //faceGYO, ぎょ(2)
- {46,47,0,0 }, //faceYOKONIKO, 横ニコ(2)
- {48,49,50,51 }, //faceMEHABANAMIDA, 目幅涙(4)
- {52,53,54,55 }, //facePERORI, ペロリ(4)
- {56,57,58,59 }, //faceBIMYO 微妙(4)
- };
-
-
-
- /*
- COM顔パターンコードの名前
- */
- char *faceNAME[faceBIMYO+1]={
- "(NULL)", //faceNULL,
- "照れ", //faceTERE,
- "目ぱち", //faceMEPACHI,
- "目ぱち2", //faceMEPACHI2,
- "うさこ", //faceUSAKO,
- "指さし", //faceYUBISASHI,
- "クラッカー", //faceCLACKER,
- "大口", //faceOOGUCHI,
- "手フリ", //faceTEFURI,
- "ビックリ目玉", //faceBIKKURIMEDAMA,
- "え~っと", //faceETTO,
- "鼻眼鏡", //faceHANAMEGANE,
- "口笛", //faceKUCHIBUE,
- "怒り", //faceIKARI,
- "ベロ", //faceBERO,
- "ため息", //faceTAMEIKI,
- "お願い", //faceONEGAI,
- "片目", //faceKATAME,
- "あとずさり", //faceATOZUSARI,
- "膨れっ面", //faceFUKURETTURA,
- "えへ", //faceEHE,
- "ぎょ", //faceGYO,
- "横ニコ", //faceYOKONIKO,
- "目幅涙", //faceMEHABANAMIDA,
- "ペロリ", //facePERORI,
- "微妙", //faceBIMYO
- };
-
-
-
-
- /*
- キャラクターチェック用管理タスク
- COM顔をならべるだけ
- */
- int CHRTEST000_JOB(t)
- TASK *t;
- {
- int en;
- TASK *eTask;
- int mx,my,bx,by;
-
- if( t->local_counter==0 ){
- // screen(0,3,1,1);
- HOME(0,256,0);
- for( en=0; en<=faceBIMYO; en++ ){
- eTask=ETaskAlloc();
- if( eTask ){
- eTask->func_addr=ENEMY000_JOB;
- eTask->disp0_addr=MUS0;
- eTask->disp0_x=((en%6)*40+20)<<16;
- eTask->disp0_y=((en/6)*40+20)<<16;
- eTask->task_command=en;
- }
- }
- MS_CURON();
- }
-
- /*マウス動いたら
- */
- if( oDev.mx!=Dev.mx || oDev.my!=Dev.my ){
- mx=Dev.mx;
- my=Dev.my;
- for( en=0; en<=faceBIMYO; en++ ){
- bx=(en%6)*40+20;
- by=(en/6)*40+20;
- if( mx-16<bx && bx<mx+16 && my-16<by && by<my+16 ){
- locate(0,15); printf(" ");
- locate(0,15); printf(faceNAME[en]);
- }
- }
- }
-
-
- if( sDev.kb[0]==0x02 ){
- gameStep=STEP_EXIT;
- }
-
-
- }
-
-
-
- /*
- 次のCOM顔の顔コードを返す
- */
- short com_newface()
- {
- short res;
- short r100=rand()%100;
-
- /*
- 連勝中
- */
- if( winlose_COM_COMBO>=5 ){ ; switch( kanjyo_HYOUKA ){
- //5連勝以上
- case 0:
- case 1: res=faceHANAMEGANE; break;
- case 2: res=faceBIKKURIMEDAMA; break;
- case 3: res=faceYOKONIKO; break;
- case 4: res=faceGYO; break;
- }}
- if( winlose_COM_COMBO>=3 ){ ; switch( kanjyo_HYOUKA ){
- //3連勝以上
- case 0: res=faceHANAMEGANE; break;
- case 1: res=faceBIKKURIMEDAMA; break;
- case 2: res=faceYOKONIKO; break;
- case 3: res=faceGYO; break;
- case 4: res=faceTERE; break;
- }}
-
- /*
- 連敗中
- */
- else if( winlose_COM_COMBO<=-4 ){ ; switch( kanjyo_HYOUKA ){
- //4連負け以上
- //負け続けると、ちょっと傾向がかわる
- case 0: res=faceBERO; break;
- case 1: res=faceOOGUCHI; break;
- case 2: res=(r100<50)?faceKATAME:faceMEHABANAMIDA; break;
- case 3: res=(r100<50)?faceATOZUSARI:faceCLACKER; break;
- case 4: res=(r100<50)?faceYUBISASHI:faceCLACKER; break;
- }}
- else if( winlose_COM_COMBO<=-2 ){ ; switch( kanjyo_HYOUKA ){
- //2連負け以上
- case 0: res=faceFUKURETTURA; break;
- case 1: res=faceBERO; break;
- case 2: res=faceOOGUCHI; break;
- case 3: res=faceMEHABANAMIDA; break;
- case 4: res=faceCLACKER; break;
- }}
-
- /*
- 通常
- */
- else{
- switch( kanjyo_HYOUKA ){
- //通常
- case 0: res=faceEHE; break;
- case 1: res=facePERORI; break;
- case 2: res=faceMEPACHI; break;
- case 3: res=faceMEPACHI2; break;
- case 4: res=faceUSAKO; break;
- }
- if( r100<12 ){ ; switch( kanjyo_HYOUKA ){
- //たまに表情をかえてみる
- //手はよく振る・やっぱり調子が悪いとため息なんかついたり、怒ったりする
- case 0: res=faceBIMYO; break;
- case 1: res=(r100<10)?faceTEFURI:faceBIMYO; break;
- case 2: res=(r100<10)?faceTEFURI:faceKUCHIBUE; break;
- case 3: res=(r100<10)?faceTAMEIKI:faceONEGAI; break;
- case 4: res=(r100<10)?faceTAMEIKI:faceIKARI; break;
- }}
- //状態にかかわらず、たまに変な顔になる
- if( r100<2 ){
- res=faceETTO;
- }
- }
-
- return(res);
- }
-
-
-
-
- /*
- COM:task_commandから入ってきた表情から、勝手にアニメを展開
- */
-
- //ワークの使用状況
- #define MEPACHI_FLAG (t->work[0])
- #define ANIM_LEFT (t->work[1])
-
- #define BOUND_FLAG (t->work[2]) //ほうりなげフラグ?
- #define BOUND_VX (*(int *) (&t->work[4])) //現在X速度
- #define BOUND_VY (*(int *) (&t->work[6])) // Y速度
-
- #define BOUND_G (0x10000) //重力加速度
-
-
- int ENEMY000_JOB(t)
- TASK *t;
- {
- SPINFO *s;
-
- char tc; //=task_command
-
- s=t->disp0_addr;
- tc=t->task_command;
-
- /*
- 初期設定
- */
- if( t->local_counter==0 ){
- if( BOUND_FLAG ){
- t->disp0_x=(rand()%128+192)<<16;
- t->disp0_y=(-16)<<16;
- BOUND_VX=((rand()%24+1)<<14)/2*3;
- BOUND_VY=BOUND_G;
- }
- }
-
-
- /*
- バウンドアニメ
- */
- if( BOUND_FLAG ){
- t->disp0_x-=BOUND_VX;
- BOUND_VY+=BOUND_G;
- t->disp0_y+=BOUND_VY;
- if( t->disp0_y>(240<<16) ){ //跳ね返り位置(下辺)
- t->disp0_y=(240<<16);
- BOUND_VY=-(BOUND_VY*15/16);
- }
- //跳ね返り
- if( t->disp0_x<=(16)<<16 ){
- BOUND_VX=-BOUND_VX;
- }
- //終了判定
- if( t->disp0_x>=(320)<<16 ){
- ETaskFree(t);
- goto quick_exit;
- }
- }
-
-
- /*
- アニメ関連
- */
- switch( t->task_command ){
-
- /*
- アニメ無し組
- */
- case faceNULL:
- case faceTERE:
- case faceUSAKO:
- t->disp0_anim=facePAT[tc][0];
- break;
-
- /*
- めぱち組
- */
- case faceMEPACHI:
- case faceMEPACHI2:
- if( MEPACHI_FLAG==1 ){ ; switch( t->local_counter%30 ){
- case 0: t->disp0_anim=facePAT[tc][0]; break; //実は呼ばれない
- case 8: t->disp0_anim=facePAT[tc][1]; break;
- case 15: t->disp0_anim=facePAT[tc][2]; break;
- case 22: t->disp0_anim=facePAT[tc][0]; break;
- case 29: MEPACHI_FLAG=0; break;
- }}
- else{
- t->disp0_anim=facePAT[tc][0];
- if( (t->local_counter%30)==0 ){
- if( (rand()%20)>15 ){
- MEPACHI_FLAG=1;
- }
- }
- }
- break;
-
- /*
- インターバル固定2枚組
- */
- case faceTEFURI:
- case faceYUBISASHI:
- case faceKUCHIBUE:
- case faceIKARI:
- case faceONEGAI:
- case faceFUKURETTURA:
- case faceYOKONIKO:
- if( (t->local_counter%60)<30 ){
- t->disp0_anim=facePAT[tc][0];
- }
- else{
- t->disp0_anim=facePAT[tc][1];
- }
- break;
-
-
- /*
- ランダムインターバル2枚組
- */
- case faceHANAMEGANE:
- case faceBERO:
- case faceTAMEIKI:
- case faceKATAME:
- case faceATOZUSARI:
- case faceEHE:
- case faceGYO:
- if( ANIM_LEFT>0 ){
- t->disp0_anim=facePAT[tc][MEPACHI_FLAG];
- ANIM_LEFT--;
- }
- else{
- ANIM_LEFT=(rand()%8+4)*4;
- MEPACHI_FLAG=(MEPACHI_FLAG==0)?1:0;
- }
- break;
-
-
- /*
- ペロリ
- MEPACHI_FLAG==1 左→右
- MEPACHI_FLAG==2 左←右
- */
- case facePERORI:
- if( MEPACHI_FLAG>0 ){
- char dir[3][4]={
- {0,0,0,0},
- {3,2,1,0},
- {3,0,1,2}
- };
- switch( t->local_counter%30 ){
- case 0: t->disp0_anim=facePAT[tc][dir[MEPACHI_FLAG][0]]; break; //実は呼ばれない
- case 8: t->disp0_anim=facePAT[tc][dir[MEPACHI_FLAG][1]]; break;
- case 15: t->disp0_anim=facePAT[tc][dir[MEPACHI_FLAG][2]]; break;
- case 22: t->disp0_anim=facePAT[tc][dir[MEPACHI_FLAG][3]]; break;
- case 29: MEPACHI_FLAG=0; break;
- }
- }
- else{
- t->disp0_anim=facePAT[tc][3];
- if( (t->local_counter%30)==0 ){
- switch( rand()%20 ){
- case 19: MEPACHI_FLAG=1; break;
- case 18: MEPACHI_FLAG=2; break;
- }
- }
- }
- break;
-
- /*
- 順序関係無し3枚組
- */
- case faceOOGUCHI:
- case faceBIKKURIMEDAMA:
- case faceETTO:
- if( (t->local_counter%30)==0 ){
- t->disp0_anim=facePAT[tc][rand()%3];
- }
- break;
-
- /*
- 順序関係無し3枚組:サイクル速く
- */
- case faceCLACKER:
- if( (t->local_counter%6)==0 ){
- t->disp0_anim=facePAT[tc][rand()%3];
- }
- break;
-
- /*
- 順序関係無し4枚組
- */
- case faceBIMYO:
- if( (t->local_counter%30)==0 ){
- t->disp0_anim=facePAT[tc][rand()%4];
- }
- break;
-
- /*
- 目幅なみだ:たまにしか途切れない
- */
- case faceMEHABANAMIDA:
- if( (t->local_counter%3)==0 ){
- char n;
- n=rand()%32;
- if( n!=0 ){ n=(n%3)+1; }
- t->disp0_anim=facePAT[tc][n];
- }
- break;
- }
-
- /*
- アニメ強制OFF?
- */
- if( dipSwitch&0x20 ){
- t->disp0_anim=facePAT[tc][0];
- }
-
-
- quick_exit:
- return(0);
- }
-
-
-
-
-
- /*
- ゲーム中のダイアログ?というよりボタン
- */
- typedef enum {
- bottonMORECARD,
- bottonMOREBET,
- bottonYOUWIN,
- bottonYOULOSE,
- bottonYOUWIN2,
- bottonYOULOSE2,
- bottonYOUWIN3,
- bottonYOULOSE3,
- } DN;
-
- short bottonBuf[8][2992]; //max(68*44,100*20)
-
- void get_botton_ALL()
- {
- short sx,sy,wx,wy,dn;
-
- sx=64; sy=0; wx=68; wy=44; dn=bottonMORECARD;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
-
- sy=48; dn=bottonMOREBET;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
-
- sy=96; wx=100; wy=20; dn=bottonYOUWIN;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
- sy=120; dn=bottonYOULOSE;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
-
- sy=144; dn=bottonYOUWIN2;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
- sy=168; dn=bottonYOULOSE2;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
-
- sy=192; dn=bottonYOUWIN3;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
- sy=216; dn=bottonYOULOSE3;
- get(sx,sy,sx+wx-1,sy+wy-1,bottonBuf[dn],wx*wy*sizeof(short));
- }
-
- void put_botton(dn)
- short dn;
- {
- short sx[]={176,176,48,48,48,48,48,48},
- sy[]={144,144,108,128,108,128,108,128},
- wx[]={68,68,100,100,100,100,100,100},
- wy[]={44,44,20,20,20,20,20,20};
-
- put(sx[dn],sy[dn],sx[dn]+wx[dn]-1,sy[dn]+wy[dn]-1,
- bottonBuf[dn],wx[dn]*wy[dn]*sizeof(short));
- }
-
- void put_botton_CLOSE()
- {
- short x=160,y=144;
- fill(x,y,x+96-1,y+64-1,0x7800,0xffff);
- }
-
-
- /*
- ボタンをクリックしたか
- 0=していない
- 1=上のダイアログをクリック
- 2=下のダイアログをクリック
- */
- short on_botton_MORECARD(mx,my)
- int mx,my;
- {
- short res=0;
- short x=176,y=144,y2=166,wx=72,wy=20;
-
- if( x<=mx && mx<=(x+wx-1) ){
- if( y<=my && my<=(y+wy-1) ){
- res=1;
- }
- else if( y2<=my && my<=(y2+wy-1) ){
- res=2;
- }
- }
-
- return(res);
- }
-
-
- #define on_botton_MOREBET(mx,my) on_botton_MORECARD(mx,my)
-
-
- /*
- ステージ進行管理タスク:複数起動不可
- */
- short stageNumber; //ステージ番号0~3
- short dispWait_COM; //COMの操作表示時におけるwait
-
-
- TASK *PLAYERADR; //プレイヤーのタスクワークアドレス
- TASK *ENEMYADR; //敵(COM)のタスクワークアドレス
- int STAGE000_JOB(t)
- TASK *t;
- {
- /*
- 初期設定
- */
- if( t->local_counter==0 ){
- TASK *eTask;
-
- SOUND_CALL(BGM_MAIN);
- // VPAGE(0);
- {
- unsigned short *s,*d;
- s=0xC40000;
- d=0xC00000;
- while( d<0xC40000 ){
- *d++=*s++;
- }
- }
- // VPAGE(0x0f);
- // CRTMOD(270);
- TNUM__SetPalet();
- MS_CURON();
- get_botton_ALL();
- fill(33,0,164,255,0x7800,0xffff);
-
- sp_disp(1);
- sp_on(0,127);
- v_priority("TSG","0123");
-
- eTask=ETaskAlloc(); //COM
- if( eTask ){
- ENEMYADR=eTask;
- eTask->func_addr=ENEMY000_JOB;
- eTask->disp0_addr=MUS0;
- eTask->disp0_anim=1;
- eTask->disp0_x= 16<<16; //208<<16;
- eTask->disp0_y=111<<16; // 64<<16;
- }
- eTask=ETaskAlloc(); //PLAYER
- if( eTask ){
- PLAYERADR=eTask;
- eTask->func_addr=ENEMY000_JOB;
- eTask->disp0_addr=MUS0;
- eTask->disp0_anim=0;
- eTask->disp0_x= 16<<16; //208<<16;
- eTask->disp0_y=144<<16; //172<<16;
- }
- t->local_step=LS_Init0i;
- biorhythm_FIRSTSTEP();
- chips_INIT();
- winlose_INIT();
- }
-
-
- /*
- 表示ウェイト関係
- */
- if( dispWait_COM>0 ){
- dispWait_COM--; //表示待ち
- goto quick_exit;
- }
-
-
-
- /*
- カードシャッフルして配る
- */
- if( t->local_step==LS_Init0i ){
- card_PLAYER_HAVE=0;
- card_COM_HAVE=0;
- card_SHUF();
- card_KUBARU_PLAYER();
- card_KUBARU_COM();
- card_KUBARU_PLAYER();
- card_KUBARU_COM();
- biorhythm_NEXTSTEP();
- chips_PLAYER_FIRSTBET();
- SOUND_CALL(SE_KACHI);
- }
-
-
- /*
- 最初の2枚を配った時点による
- むすめさんの感情値/感情評価値/表情、を更新
- */
- if( t->local_step==LS_Init0i ){
- kanjyo_plus_KOUSIN();
- kanjyo_hyouka_KOUSIN();
- ENEMYADR->task_command=com_newface(); //表情更新
- }
-
-
- /*
- 現在のいろんな情報をまとめて表示
- */
- if(
- t->local_step==LS_Init0i ||
- t->local_step==LS_Player0i ||
- t->local_step==LS_Com0i
- ){
- // cls();
- print_gameinfo();
- }
-
-
- /*
- プレーヤー思考?
- */
- if( t->local_step==LS_Player0i ){
- put_botton(bottonMORECARD);
- // printf("カードを1枚もらう→ L-click\n");
- // printf("これで勝負→ R-click\n");
- t->local_step=LS_Player0m;
- }
- else if( t->local_step==LS_Player0m && sDev.mbl==-1 ){
- if( on_botton_MORECARD(Dev.mx,Dev.my)==2 ){
- //もう1枚もらう
- card_KUBARU_PLAYER();
- card_DRAW_PLAYER();
- SOUND_CALL(SE_CARD_KUBARU);
- {
- short pl;
- pl=card_TOTAL(card_PLAYER);
- if( pl>21 ){
- //実はどぼんしていた
- t->local_step=LS_Judge0i;
- print_gameinfo();
- goto end_playerturn;
- }
- else{
- t->local_step=LS_Player0i;
- }
- }
- if( card_PLAYER_HAVE==5 ){
- //手札がいっぱい(5枚)になった
- t->local_step=LS_Bet0i;
- }
- }
- else if( on_botton_MORECARD(Dev.mx,Dev.my)==1 ){
- //これで勝負
- t->local_step=LS_Bet0i;
- }
- }
- end_playerturn:
- ;
-
-
-
- /*
- 賭けチップの上乗せ
- */
- if( t->local_step==LS_Bet0i ){
- SOUND_CALL(SE_CARD_MEKURU);
- put_botton(bottonMOREBET);
- // printf("L-click:追加チップ+1/R-click:勝負に!");
- t->local_step=LS_Bet0m;
- }
- else if( t->local_step==LS_Bet0m && sDev.mbl==-1 ){
- if( on_botton_MOREBET(Dev.mx,Dev.my)==1 ){
- //もう1枚かける
- chips_PLAYER_SECONDBET();
- SOUND_CALL(SE_BET_UP);
- print_chips();
- if( chips_BET>=10 ){ //一度に10枚以上かけられない
- put_botton_CLOSE();
- t->local_step=LS_Com0i;
- }
- }
- else if( on_botton_MOREBET(Dev.mx,Dev.my)==2 ){
- //これで勝負
- t->local_step=LS_Com0i;
- }
- if( t->local_step==LS_Com0i ){
- SOUND_CALL(SE_CARD_MEKURU);
- }
- }
-
-
-
- /*
- COM思考
- */
- if( t->local_step==LS_Com0i ){
- // printf("COM思考中");
-
- t->local_step=LS_Com0m;
- dispWait_COM=30; //1/2秒
- }
- else if( t->local_step==LS_Com0m ){
- if( Com_think()>0 ){
- //COMもう1枚もらう
- card_KUBARU_COM();
- // card_DRAW();
- card_DRAW_back_COM();
- SOUND_CALL(SE_CARD_KUBARU);
- if( card_TOTAL(card_COM)>21 ){ //どぼんした時の感情値更新
- kanjyo_dobon_KOUSIN();
- t->local_step=LS_Judge0i;
- goto end_comturn;
- }
- else{
- kanjyo_plus_KOUSIN();
- }
- kanjyo_hyouka_KOUSIN();
- if( card_COM_HAVE==5 ){
- //手札がいっぱい(5枚)になった
- t->local_step=LS_Judge0i;
- goto end_comturn;
- }
- t->local_step=LS_Com0i;
- }
- else{
- //COMこれで勝負
- t->local_step=LS_Judge0i;
- dispWait_COM=30; //1/2秒
- }
- }
- end_comturn:
- ;
-
-
- /*
- 勝ち負け判定
- */
- if( t->local_step==LS_Judge0i ){
- card_DRAW();
- SOUND_CALL(SE_CARD_MEKURU);
- // printf("勝負判定:");
- t->local_step=LS_Judge0m;
- }
- else if( t->local_step==LS_Judge0m ){
- short pl,com;
-
- winlose_COM_HISTORY[0]=0;
- /*
- 特殊ボーナスチェック
- */
- if( card_CHECK777(card_PLAYER) ){
- /*
- プレーヤー777ビンゴ
- */
- // printf("PLAYERの「777」3倍勝ち");
- put_botton(bottonYOUWIN3);
- kanjyo_NOW+=bounus_LOSE[card_PLAYER_HAVE][card_COM_HAVE];
- chips_PLAYER_WIN3(); //3倍勝ち
- winlose_COMBO_COMLOSE();
- goto judge_end;
- }
- if( card_CHECK777(card_COM) ){
- /*
- COM777ビンゴ
- */
- // printf("COMの「777」3倍勝ち");
- put_botton(bottonYOULOSE3);
- kanjyo_NOW+=bounus_WIN[card_PLAYER_HAVE][card_COM_HAVE];
- chips_COM_WIN3();
- winlose_COMBO_COMWIN();
- goto judge_end;
- }
- if( card_CHECK678(card_PLAYER) ){
- /*
- プレーヤー678ビンゴ
- */
- // printf("PLAYERの「678」2倍勝ち");
- put_botton(bottonYOUWIN2);
- kanjyo_NOW+=bounus_LOSE[card_PLAYER_HAVE][card_COM_HAVE];
- chips_PLAYER_WIN2(); //2倍勝ち
- winlose_COMBO_COMLOSE();
- goto judge_end;
- }
- if( card_CHECK678(card_COM) ){
- /*
- COM678ビンゴ
- */
- // printf("COMの「678」2倍勝ち");
- put_botton(bottonYOULOSE2);
- kanjyo_NOW+=bounus_WIN[card_PLAYER_HAVE][card_COM_HAVE];
- chips_COM_WIN2();
- winlose_COMBO_COMWIN();
- goto judge_end;
- }
- if( card_CHECK5CARD21(card_PLAYER) ){
- /*
- プレーヤー5枚21ビンゴ
- */
- // printf("PLAYERの「5枚21」3倍勝ち");
- put_botton(bottonYOUWIN3);
- kanjyo_NOW+=bounus_LOSE[card_PLAYER_HAVE][card_COM_HAVE];
- chips_PLAYER_WIN3(); //3倍勝ち
- winlose_COMBO_COMLOSE();
- goto judge_end;
- }
- if( card_CHECK5CARD21(card_COM) ){
- /*
- COM5枚21ビンゴ
- */
- // printf("COMの「5枚21」3倍勝ち");
- put_botton(bottonYOULOSE3);
- kanjyo_NOW+=bounus_WIN[card_PLAYER_HAVE][card_COM_HAVE];
- chips_COM_WIN3();
- winlose_COMBO_COMWIN();
- goto judge_end;
- }
-
- /*
- 通常チェック
- */
- pl=card_TOTAL(card_PLAYER);
- com=card_TOTAL(card_COM);
- if( pl>21 && com>21 ){
- /*
- PLAYERもCOMもドボン
- */
- // printf("おながれ");
- chips_MODOSU();
- winlose_COM_DRAW_TOTAL++;
- }
- else if( pl==21 && com==21 ){
- /*
- PLAYERもCOMも21の場合は、PLAYERの2倍勝ち
- */
- // printf("PLAYERの2倍勝ち");
- put_botton(bottonYOUWIN2);
- kanjyo_NOW+=bounus_LOSE[card_PLAYER_HAVE][card_COM_HAVE]; //COMにとって負け
- chips_PLAYER_WIN2(); //2倍勝ち
- winlose_COMBO_COMLOSE();
- }
- else if( pl!=21 && com==21 ){
- /*
- COMだけ21の場合は、COMの2倍勝ち
- */
- // printf("COMの2倍勝ち");
- put_botton(bottonYOULOSE2);
- kanjyo_NOW+=bounus_WIN[card_PLAYER_HAVE][card_COM_HAVE];
- chips_COM_WIN2();
- winlose_COMBO_COMWIN();
- }
- else if( (pl>com && pl<=21) || com>21 ){
- /*
- PLAYERがCOMより大きく、PLAYERは21以下。
- もしくは、COMドボン
- */
- // printf("PLAYERの勝ち");
- put_botton(bottonYOUWIN);
- kanjyo_NOW+=bounus_LOSE[card_PLAYER_HAVE][card_COM_HAVE]; //COMにとって負け
- chips_PLAYER_WIN();
- winlose_COMBO_COMLOSE();
- }
- else if( (pl<=com && com<=21) || pl>21 ){
- /*
- COMがPLAYERより大きく、COMは21以下。
- もしくは、PLAYERドボン
- */
- // printf("COMの勝ち");
- put_botton(bottonYOULOSE);
- kanjyo_NOW+=bounus_WIN[card_PLAYER_HAVE][card_COM_HAVE];
- chips_COM_WIN();
- winlose_COMBO_COMWIN();
- }
- judge_end:
- kanjyo_NOW=kanjyo_limit(kanjyo_NOW);
- t->local_step=LS_Wait0i;
- winlose_COM_GAME_TOTAL++;
-
- /*
- CHIPSの判定
- */
- if( chips_COM<=0 ){
- t->local_step=LS_GameClear0i;
- }
- if( chips_PLAYER<=0 ){
- t->local_step=LS_GameOver0i;
- }
- }
-
-
- /*
- ゲームオーバー/クリア?
- */
- if( t->local_step==LS_GameOver0i || t->local_step==LS_GameClear0i ){
- short *vram,z=0;
- for( vram=0xe00000; vram<0xe80000; vram++ ){
- *vram=z;
- }
- ETaskFree(ENEMYADR);
- ETaskFree(PLAYERADR);
- dispWait_COM=60;
- if( t->local_step==LS_GameOver0i ){ t->local_step=LS_GameOver0m; }
- else if( t->local_step==LS_GameClear0i ){ t->local_step=LS_GameClear0m; }
- }
- else if( t->local_step==LS_GameClear0m || t->local_step==LS_GameOver0m ){
- static short cnt;
- short of;
- if( cnt<=24 ){
- if( t->local_step==LS_GameClear0m ){
- TR_PUT((24-cnt)*8,0,25-cnt);
- TR_PUT(cnt*8,128,52-(24-cnt));
- }
- else{
- TR_PUT((24-cnt)*8,0,0);
- TR_PUT(cnt*8,128,0);
- }
- cnt++;
- dispWait_COM=2;
- }
- else if( 25<=cnt && cnt<=41 ){
- if( t->local_step==LS_GameClear0m ){
- TASK *eTask;
- eTask=ETaskAlloc();
- if( eTask ){
- eTask->func_addr=ENEMY000_JOB;
- eTask->disp0_addr=MUS0;
- eTask->task_command=(rand()%(faceBIMYO-1))+1;
- eTask->work[2]=1; //ほうりなげフラグ
- }
- }
- of=cnt-25;
- box(64-of,128-of,192+of,129+of,0x7800,0xffff);
- cnt++;
- }
- else if( cnt==42 ){
- of=cnt-25;
- box(64-of,128-of,192+of,129+of,0xffff,0xffff);
- if( t->local_step==LS_GameClear0m ){
- symbol(64,120," おめでとさん ",1,1,1,0xffff,0);
- }
- else{
- symbol(64,120," 負けちゃったい ",1,1,1,0xffff,0);
- }
- cnt++;
- }
- else if( cnt==43 && sDev.mbl==-1 ){
- TASK *mTask;
- AllETaskFree();
- MTaskFree(t);
- mTask=MTaskAlloc();
- mTask->func_addr=STAGE000_JOB;
- cnt=0;
- goto quick_exit;
- }
- }
-
-
- /*
- 待ちましょう
- */
- if( t->local_step==LS_Wait0i ){
- put_botton_CLOSE();
- change_BGM();
- // printf("\nマウスをクリックで次の試合\n");
- t->local_step=LS_Wait0m;
- }else if( t->local_step==LS_Wait0m ){
- if( sDev.mbl==-1 ){
- t->local_step=LS_Init0i;
- goto quick_exit;
- }
- }
-
-
-
- /*
- STEP更新(単純更新のみ)
- */
- switch( t->local_step ){
- case LS_Init0i: t->local_step=LS_Init0m; break;
- case LS_Init0m: t->local_step=LS_Player0i; break;
- }
-
-
- if( oDev.kb[0]!=0x02 && Dev.kb[0]==0x02 ){
- gameStep=STEP_EXIT;
- }
-
- quick_exit:;
- return(0);
- }
-
-
-
-
-
-
- /* [ EOF ] */
-
-